//class Solution {
//public:
//    int removeDuplicates(vector<int>& nums)
//    {
//        int len = nums.size();
//        int l = 1;
//        int cnt = 1;
//        for (int i = 1; i < len; i++)
//        {
//            if (nums[i] == nums[i - 1])
//            {
//                if (cnt < 2)
//                {
//                    nums[l++] = nums[i];
//                    cnt++;
//
//                }
//            }
//            else
//            {
//                nums[l++] = nums[i];
//                cnt = 1;
//
//            }
//
//        }
//        return l;
//    }
//};


//class Solution {
//public:
//
//    void rotate(vector<int>& nums, int k)
//    {
//        int n = nums.size();
//        reverse(nums.end() - (k % n), nums.end());
//        reverse(nums.begin(), nums.end() - (k % n));
//        reverse(nums.begin(), nums.end());
//    }
//};


//class Solution {
//public:
//    int maxProfit(vector<int>& prices)
//    {
//        int l = 0;
//        int r = 1;
//        int ret = 0;
//        int size = prices.size();
//
//        while (r < size)
//        {
//            if (prices[r] > prices[l])
//            {
//                ret = max(ret, prices[r] - prices[l]);
//            }
//            else
//            {
//                l = r;
//            }
//            r++;
//        }
//
//        return ret;
//    }
//};


//class Solution {
//public:
//    int maxProfit(vector<int>& prices)
//    {
//        int ret = 0;
//        int size = prices.size();
//
//        for (int i = 1; i < size; i++)
//        {
//            if (prices[i] > prices[i - 1])
//            {
//                ret += prices[i] - prices[i - 1];
//            }
//        }
//
//        return ret;
//    }
//};


//#include <iostream>
//#include <algorithm>
//using namespace std;
//
//const int T = 1010;
//const int M = 110;
//
//int t[M] = { 0 };
//int w[M] = { 0 };
//long long f[T] = { 0 };
//
//int n, m;
//
//int main()
//{
//	cin >> m >> n;
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> t[i] >> w[i];
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = m; j >= t[i]; j--)
//		{
//			
//			f[j] = max(f[j], f[j - t[i]] + w[i]);
//		}
//	}
//
//	cout << f[m] << endl;
//	return 0;
//}
//


#include <iostream>
using namespace std;

const int N = 1e5 + 10;

typedef long long ll;

int n, m;
ll f[N] = { 0 };

ll get(ll x)
{
	ll ret = 0;
	ll sum = 0;

	for (int i = 1; i <= n; i++)
	{
		if (f[i] > x)
			return m + 1;
		if (sum + f[i] > x)
		{
			sum = 0;
			ret++;
		}
		sum += f[i];

	}
	return ret;

}

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> f[i];
	}

	ll left = 1;
	ll right = 1e9 + 10;

	while (left < right)
	{
		ll mid = (left + right) / 2;
		if (get(mid) <= m - 1)
			right = mid;
		else
			left = mid + 1;

	}

	cout << left << endl;

	return 0;
}